#ifndef _CORE_SYSTEMHANDLER_H_
#define _CORE_SYSTEMHANDLER_H_

#include "Define.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief socket 类型
 */
typedef enum {
    tcpClient
} SocketType;

/**
 * @brief 通道选项
 */
typedef enum {
    socketType,                 /**socket类型*/
    netPort,                    /**网络端口号*/
    netHost,                    /**网络连接地址*/
    connectTimeout,             /**连接超时时间*/
    networkCred,                /**网络安全参数*/
} NetOption;

/**
 * @brief 网络地址定义
 */
typedef struct {
    char        address[16];    /**ip 地址*/
    int32_t     port;           /**端口信息*/
} NetAddress;

/**
 * @brief 系统操作接口定义
 */
typedef struct {
    /**
     * @brief 申请内存
     * @param size
     */
    void* (*memMalloc)(uint32_t size);
    /**
     * @brief 释放内存
     * @param ptr
     */
    void  (*memFree)(void* ptr);
    /**
     * @brief 获取时间戳
     */
    uint64_t  (*getTimestamp)();
    /**
     * @brief 休眠
     * @param time  休眠时间,单位 ms
     */
    void  (*sleep)(int64_t time);
    /**
     * @brief 获取随机数
     * @param[out] out
     * @param[in]  outLen
     */
    void  (*getRand)(int8_t* out,int32_t outLen);
    /**
     * @brief 创建互斥锁
     * @return 互斥锁句柄
     */
    void* (*createMutex)();
    /**
     * @brief 锁进入
     * @param[in] mutex 互斥锁句柄
     */
    void  (*enterMutex)(void* mutex);
    /**
     * @brief 锁离开
     * @param[in] mutex 互斥锁句柄
     */
    void  (*leaveMutex)(void* mutex);
    /**
     * @brief 销毁互斥锁
     * @param[in] mutex 互斥锁句柄
     */
    void  (*destroyMutex)(void** mutex);
    /**
     * @brief 创建1个网络
     */
    void * (*createNet)(void);
    /**
     * @brief 配置1个网络会话的连接参数
     */
    int32_t (*setNetOption)(void *handle, NetOption option, void *data);
    /**
     * @brief 建立网络连接
     */
    int32_t (*netEstablish)(void *handle);
    /**
     * @brief 从指定的网络会话上读取
     */
    int32_t (*netRecv)(void *handle, uint8_t *buffer, uint32_t len,int32_t* readLen,uint32_t timeout,NetAddress* addr);
    /**
     * @brief 在指定的网络会话上发送
     */
    int32_t (*netSend)(void *handle, uint8_t *buffer, uint32_t len,int32_t* sendLen,uint32_t timeout,NetAddress *addr);
    /**
     * @brief 销毁网络
     */
    int32_t (*destroyNet)(void **handle);

} SystemInterface;

/**
 * @brief 设置系统处理器
 * @param[in] interface
 */
void setSystemInterface(SystemInterface* interface);
/**
 * @brief 获取系统接口
 * @return
 */
SystemInterface* getSystemInterface();

#ifdef __cplusplus
}
#endif
#endif //_CORE_ADPATER_H_
